{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 人脸识别与计算机视觉文档实践\n",
    "\n",
    ">* 本周主要内容：人脸（Face） API文档不同平台对比与实践及计算机视觉入门（认知服务）\n",
    ">* 202009_API_人工智能与机器学习_week03\n",
    ">*  电子讲义设计者：许智超\n",
    "<br/>\n",
    "<br/>\n",
    "\n",
    "## 复习\n",
    "\n",
    "* 上周主要内容： \n",
    ">    * 1、API文档\n",
    ">    * 2、认知服务-人脸识别\n",
    ">    * 3、pandas黑魔法（json_normalize）\n",
    "-----\n",
    "* 提问、检查与扩展：\n",
    ">    * 1、上周的Azure face API随机检查2位同学，对于API文档是否有能力详细阅读？\n",
    ">    * 2、抽查2位同学，对于获取的数据用途有何思考？是否尝试其他平台（XXX API、XXX API）      \n",
    ">    * 3、扩展: 我们尝试抽取了4张图片，包含AB、ABC、BCD、ABCD四个人物特征，如何通过API检查数据差异？\n",
    "  \n",
    "\n",
    "-----\n",
    "## 本周学习目标：\n",
    "\n",
    "> $\\mathcal{1、Azure 认知服务-人脸集合演示}$     \n",
    "> $\\mathcal{2、Face++ 之 FaceSets 实践}$     \n",
    "> $\\mathcal{3、计算机视觉实践}$    \n",
    "\n",
    "\n",
    "\n",
    "## 学生权限\n",
    "\n",
    "* [访问学生权益](https://azure.microsoft.com/zh-cn/education/)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       "/* 本电子讲义使用之CSS */\n",
       "div.code_cell {\n",
       "    background-color: #e5f1fe;\n",
       "}\n",
       "div.cell.selected {\n",
       "    background-color: #effee2;\n",
       "    font-size: 2rem;\n",
       "    line-height: 2.4rem;\n",
       "}\n",
       "div.cell.selected .rendered_html table {\n",
       "    font-size: 2rem !important;\n",
       "    line-height: 2.4rem !important;\n",
       "}\n",
       ".rendered_html pre code {\n",
       "    background-color: #C4E4ff;   \n",
       "    padding: 2px 25px;\n",
       "}\n",
       ".rendered_html pre {\n",
       "    background-color: #99c9ff;\n",
       "}\n",
       "div.code_cell .CodeMirror {\n",
       "    font-size: 2rem !important;\n",
       "    line-height: 2.4rem !important;\n",
       "}\n",
       ".rendered_html img, .rendered_html svg {\n",
       "    max-width: 50%;\n",
       "    height: auto;\n",
       "    float: center;\n",
       "}\n",
       "/* Gradient transparent - color - transparent */\n",
       "hr {\n",
       "    border: 0;\n",
       "    border-bottom: 1px dashed #ccc;\n",
       "}\n",
       ".emoticon{\n",
       "    font-size: 5rem;\n",
       "    line-height: 4.4rem;\n",
       "    text-align: center;\n",
       "    vertical-align: middle;\n",
       "}\n",
       "\n",
       "</style>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%html\n",
    "<style>\n",
    "/* 本电子讲义使用之CSS */\n",
    "div.code_cell {\n",
    "    background-color: #e5f1fe;\n",
    "}\n",
    "div.cell.selected {\n",
    "    background-color: #effee2;\n",
    "    font-size: 2rem;\n",
    "    line-height: 2.4rem;\n",
    "}\n",
    "div.cell.selected .rendered_html table {\n",
    "    font-size: 2rem !important;\n",
    "    line-height: 2.4rem !important;\n",
    "}\n",
    ".rendered_html pre code {\n",
    "    background-color: #C4E4ff;   \n",
    "    padding: 2px 25px;\n",
    "}\n",
    ".rendered_html pre {\n",
    "    background-color: #99c9ff;\n",
    "}\n",
    "div.code_cell .CodeMirror {\n",
    "    font-size: 2rem !important;\n",
    "    line-height: 2.4rem !important;\n",
    "}\n",
    ".rendered_html img, .rendered_html svg {\n",
    "    max-width: 50%;\n",
    "    height: auto;\n",
    "    float: center;\n",
    "}\n",
    "/* Gradient transparent - color - transparent */\n",
    "hr {\n",
    "    border: 0;\n",
    "    border-bottom: 1px dashed #ccc;\n",
    "}\n",
    ".emoticon{\n",
    "    font-size: 5rem;\n",
    "    line-height: 4.4rem;\n",
    "    text-align: center;\n",
    "    vertical-align: middle;\n",
    "}\n",
    "\n",
    "</style>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 复习\n",
    "\n",
    "> 1、回顾阅读API文档的关键点     \n",
    "> 2、正确阅读json数据 [jsonviewer.stack.hu(json转换检查数据)](http://jsonviewer.stack.hu)    \n",
    "> 3、pandas 中的json_normalize模块/函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A-1 面部检测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'[{\"faceId\": \"1f2bf379-70dd-41be-86c3-a63f2deb7c7f\", \"faceRectangle\": {\"top\": 118, \"left\": 144, \"width\": 88, \"height\": 88}, \"faceAttributes\": {\"smile\": 0.813, \"headPose\": {\"pitch\": -3.4, \"roll\": 1.4, \"yaw\": 9.4}, \"gender\": \"male\", \"age\": 19.0, \"facialHair\": {\"moustache\": 0.1, \"beard\": 0.1, \"sideburns\": 0.1}, \"glasses\": \"NoGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.003, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 0.813, \"neutral\": 0.184, \"sadness\": 0.0, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.21}, \"exposure\": {\"exposureLevel\": \"overExposure\", \"value\": 0.81}, \"noise\": {\"noiseLevel\": \"low\", \"value\": 0.01}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": false}, \"accessories\": [], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.18, \"invisible\": false, \"hairColor\": [{\"color\": \"brown\", \"confidence\": 0.95}, {\"color\": \"black\", \"confidence\": 0.93}, {\"color\": \"other\", \"confidence\": 0.23}, {\"color\": \"blond\", \"confidence\": 0.23}, {\"color\": \"gray\", \"confidence\": 0.21}, {\"color\": \"red\", \"confidence\": 0.15}, {\"color\": \"white\", \"confidence\": 0.0}]}}}, {\"faceId\": \"f659ea05-a658-497d-9b2a-eb89e74d5403\", \"faceRectangle\": {\"top\": 117, \"left\": 376, \"width\": 64, \"height\": 64}, \"faceAttributes\": {\"smile\": 0.456, \"headPose\": {\"pitch\": -1.1, \"roll\": -0.2, \"yaw\": 6.6}, \"gender\": \"female\", \"age\": 22.0, \"facialHair\": {\"moustache\": 0.0, \"beard\": 0.0, \"sideburns\": 0.0}, \"glasses\": \"NoGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.001, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 0.456, \"neutral\": 0.542, \"sadness\": 0.001, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.16}, \"exposure\": {\"exposureLevel\": \"goodExposure\", \"value\": 0.58}, \"noise\": {\"noiseLevel\": \"low\", \"value\": 0.01}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": true}, \"accessories\": [], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.08, \"invisible\": false, \"hairColor\": [{\"color\": \"black\", \"confidence\": 1.0}, {\"color\": \"other\", \"confidence\": 0.63}, {\"color\": \"brown\", \"confidence\": 0.46}, {\"color\": \"gray\", \"confidence\": 0.39}, {\"color\": \"blond\", \"confidence\": 0.03}, {\"color\": \"red\", \"confidence\": 0.01}, {\"color\": \"white\", \"confidence\": 0.0}]}}}, {\"faceId\": \"5e17a0f5-0a18-4a83-821a-31dd3fd014cd\", \"faceRectangle\": {\"top\": 41, \"left\": 676, \"width\": 52, \"height\": 52}, \"faceAttributes\": {\"smile\": 1.0, \"headPose\": {\"pitch\": 3.0, \"roll\": -1.3, \"yaw\": -0.6}, \"gender\": \"male\", \"age\": 25.0, \"facialHair\": {\"moustache\": 0.1, \"beard\": 0.1, \"sideburns\": 0.1}, \"glasses\": \"ReadingGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.0, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 1.0, \"neutral\": 0.0, \"sadness\": 0.0, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.0}, \"exposure\": {\"exposureLevel\": \"goodExposure\", \"value\": 0.66}, \"noise\": {\"noiseLevel\": \"low\", \"value\": 0.07}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": false}, \"accessories\": [{\"type\": \"glasses\", \"confidence\": 1.0}], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.06, \"invisible\": false, \"hairColor\": [{\"color\": \"black\", \"confidence\": 0.98}, {\"color\": \"brown\", \"confidence\": 0.96}, {\"color\": \"other\", \"confidence\": 0.22}, {\"color\": \"gray\", \"confidence\": 0.21}, {\"color\": \"red\", \"confidence\": 0.09}, {\"color\": \"blond\", \"confidence\": 0.08}, {\"color\": \"white\", \"confidence\": 0.0}]}}}, {\"faceId\": \"c9b6de20-4b5c-4a87-88ce-482b2049a45c\", \"faceRectangle\": {\"top\": 69, \"left\": 445, \"width\": 52, \"height\": 52}, \"faceAttributes\": {\"smile\": 1.0, \"headPose\": {\"pitch\": 0.2, \"roll\": 2.6, \"yaw\": 1.5}, \"gender\": \"female\", \"age\": 23.0, \"facialHair\": {\"moustache\": 0.0, \"beard\": 0.0, \"sideburns\": 0.0}, \"glasses\": \"NoGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.0, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 1.0, \"neutral\": 0.0, \"sadness\": 0.0, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.0}, \"exposure\": {\"exposureLevel\": \"goodExposure\", \"value\": 0.56}, \"noise\": {\"noiseLevel\": \"medium\", \"value\": 0.33}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": false}, \"accessories\": [], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.11, \"invisible\": false, \"hairColor\": [{\"color\": \"black\", \"confidence\": 1.0}, {\"color\": \"brown\", \"confidence\": 0.81}, {\"color\": \"other\", \"confidence\": 0.41}, {\"color\": \"gray\", \"confidence\": 0.37}, {\"color\": \"blond\", \"confidence\": 0.03}, {\"color\": \"red\", \"confidence\": 0.02}, {\"color\": \"white\", \"confidence\": 0.0}]}}}, {\"faceId\": \"c29e7a06-72de-4b77-bc5d-5568145f10eb\", \"faceRectangle\": {\"top\": 95, \"left\": 238, \"width\": 51, \"height\": 51}, \"faceAttributes\": {\"smile\": 0.981, \"headPose\": {\"pitch\": 7.2, \"roll\": 1.2, \"yaw\": 2.6}, \"gender\": \"female\", \"age\": 18.0, \"facialHair\": {\"moustache\": 0.0, \"beard\": 0.0, \"sideburns\": 0.0}, \"glasses\": \"ReadingGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.0, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 0.981, \"neutral\": 0.019, \"sadness\": 0.0, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.07}, \"exposure\": {\"exposureLevel\": \"goodExposure\", \"value\": 0.69}, \"noise\": {\"noiseLevel\": \"medium\", \"value\": 0.48}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": false}, \"accessories\": [{\"type\": \"glasses\", \"confidence\": 1.0}], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.11, \"invisible\": false, \"hairColor\": [{\"color\": \"black\", \"confidence\": 0.98}, {\"color\": \"brown\", \"confidence\": 0.86}, {\"color\": \"other\", \"confidence\": 0.4}, {\"color\": \"gray\", \"confidence\": 0.36}, {\"color\": \"blond\", \"confidence\": 0.09}, {\"color\": \"red\", \"confidence\": 0.08}, {\"color\": \"white\", \"confidence\": 0.0}]}}}, {\"faceId\": \"0192c19c-eb0a-447b-82f1-740f32eb004a\", \"faceRectangle\": {\"top\": 94, \"left\": 540, \"width\": 48, \"height\": 48}, \"faceAttributes\": {\"smile\": 1.0, \"headPose\": {\"pitch\": -7.7, \"roll\": 5.0, \"yaw\": 6.9}, \"gender\": \"female\", \"age\": 19.0, \"facialHair\": {\"moustache\": 0.0, \"beard\": 0.0, \"sideburns\": 0.0}, \"glasses\": \"NoGlasses\", \"emotion\": {\"anger\": 0.0, \"contempt\": 0.0, \"disgust\": 0.0, \"fear\": 0.0, \"happiness\": 1.0, \"neutral\": 0.0, \"sadness\": 0.0, \"surprise\": 0.0}, \"blur\": {\"blurLevel\": \"low\", \"value\": 0.08}, \"exposure\": {\"exposureLevel\": \"goodExposure\", \"value\": 0.65}, \"noise\": {\"noiseLevel\": \"low\", \"value\": 0.08}, \"makeup\": {\"eyeMakeup\": false, \"lipMakeup\": false}, \"accessories\": [], \"occlusion\": {\"foreheadOccluded\": false, \"eyeOccluded\": false, \"mouthOccluded\": false}, \"hair\": {\"bald\": 0.1, \"invisible\": false, \"hairColor\": [{\"color\": \"black\", \"confidence\": 1.0}, {\"color\": \"brown\", \"confidence\": 0.88}, {\"color\": \"other\", \"confidence\": 0.35}, {\"color\": \"gray\", \"confidence\": 0.33}, {\"color\": \"blond\", \"confidence\": 0.05}, {\"color\": \"red\", \"confidence\": 0.04}, {\"color\": \"white\", \"confidence\": 0.0}]}}}]'"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# A-1 面部检测\n",
    "import requests\n",
    "import json\n",
    "\n",
    "# set to your own subscription key value\n",
    "subscription_key = \"f212f71663134b73bdec4a5a9aece2f0\"\n",
    "assert subscription_key\n",
    "\n",
    "# replace <My Endpoint String> with the string from your endpoint URL\n",
    "face_api_url = 'https://api-hjq.cognitiveservices.azure.com/face/v1.0/detect'\n",
    "\n",
    "# 请求正文body\n",
    "image_url = 'http://newmedia.nfu.edu.cn/wcy/wp-content/uploads/2018/04/post_20180424__NFU_DoraHacks_imoji%E5%9B%A2%E9%98%9F.jpg'\n",
    "\n",
    "headers = {'Ocp-Apim-Subscription-Key': subscription_key}\n",
    "\n",
    "# 请求参数parameters\n",
    "params = {\n",
    "    'returnFaceId': 'true',\n",
    "    'returnFaceLandmarks': 'false',\n",
    "    # 可选参数,请仔细阅读API文档\n",
    "    'returnFaceAttributes': 'age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise',\n",
    "}\n",
    "\n",
    "response = requests.post(face_api_url, params=params,\n",
    "                         headers=headers, json={\"url\": image_url})\n",
    "# json.dumps 将json--->bytes\n",
    "json.dumps(response.json())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A-2 json转译\n",
    "\n",
    "> * bytes ---> json\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'faceId': '1f2bf379-70dd-41be-86c3-a63f2deb7c7f',\n",
       "  'faceRectangle': {'top': 118, 'left': 144, 'width': 88, 'height': 88},\n",
       "  'faceAttributes': {'smile': 0.813,\n",
       "   'headPose': {'pitch': -3.4, 'roll': 1.4, 'yaw': 9.4},\n",
       "   'gender': 'male',\n",
       "   'age': 19.0,\n",
       "   'facialHair': {'moustache': 0.1, 'beard': 0.1, 'sideburns': 0.1},\n",
       "   'glasses': 'NoGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.003,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 0.813,\n",
       "    'neutral': 0.184,\n",
       "    'sadness': 0.0,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.21},\n",
       "   'exposure': {'exposureLevel': 'overExposure', 'value': 0.81},\n",
       "   'noise': {'noiseLevel': 'low', 'value': 0.01},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': False},\n",
       "   'accessories': [],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.18,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'brown', 'confidence': 0.95},\n",
       "     {'color': 'black', 'confidence': 0.93},\n",
       "     {'color': 'other', 'confidence': 0.23},\n",
       "     {'color': 'blond', 'confidence': 0.23},\n",
       "     {'color': 'gray', 'confidence': 0.21},\n",
       "     {'color': 'red', 'confidence': 0.15},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}},\n",
       " {'faceId': 'f659ea05-a658-497d-9b2a-eb89e74d5403',\n",
       "  'faceRectangle': {'top': 117, 'left': 376, 'width': 64, 'height': 64},\n",
       "  'faceAttributes': {'smile': 0.456,\n",
       "   'headPose': {'pitch': -1.1, 'roll': -0.2, 'yaw': 6.6},\n",
       "   'gender': 'female',\n",
       "   'age': 22.0,\n",
       "   'facialHair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0},\n",
       "   'glasses': 'NoGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.001,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 0.456,\n",
       "    'neutral': 0.542,\n",
       "    'sadness': 0.001,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.16},\n",
       "   'exposure': {'exposureLevel': 'goodExposure', 'value': 0.58},\n",
       "   'noise': {'noiseLevel': 'low', 'value': 0.01},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': True},\n",
       "   'accessories': [],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.08,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'black', 'confidence': 1.0},\n",
       "     {'color': 'other', 'confidence': 0.63},\n",
       "     {'color': 'brown', 'confidence': 0.46},\n",
       "     {'color': 'gray', 'confidence': 0.39},\n",
       "     {'color': 'blond', 'confidence': 0.03},\n",
       "     {'color': 'red', 'confidence': 0.01},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}},\n",
       " {'faceId': '5e17a0f5-0a18-4a83-821a-31dd3fd014cd',\n",
       "  'faceRectangle': {'top': 41, 'left': 676, 'width': 52, 'height': 52},\n",
       "  'faceAttributes': {'smile': 1.0,\n",
       "   'headPose': {'pitch': 3.0, 'roll': -1.3, 'yaw': -0.6},\n",
       "   'gender': 'male',\n",
       "   'age': 25.0,\n",
       "   'facialHair': {'moustache': 0.1, 'beard': 0.1, 'sideburns': 0.1},\n",
       "   'glasses': 'ReadingGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.0,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 1.0,\n",
       "    'neutral': 0.0,\n",
       "    'sadness': 0.0,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.0},\n",
       "   'exposure': {'exposureLevel': 'goodExposure', 'value': 0.66},\n",
       "   'noise': {'noiseLevel': 'low', 'value': 0.07},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': False},\n",
       "   'accessories': [{'type': 'glasses', 'confidence': 1.0}],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.06,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'black', 'confidence': 0.98},\n",
       "     {'color': 'brown', 'confidence': 0.96},\n",
       "     {'color': 'other', 'confidence': 0.22},\n",
       "     {'color': 'gray', 'confidence': 0.21},\n",
       "     {'color': 'red', 'confidence': 0.09},\n",
       "     {'color': 'blond', 'confidence': 0.08},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}},\n",
       " {'faceId': 'c9b6de20-4b5c-4a87-88ce-482b2049a45c',\n",
       "  'faceRectangle': {'top': 69, 'left': 445, 'width': 52, 'height': 52},\n",
       "  'faceAttributes': {'smile': 1.0,\n",
       "   'headPose': {'pitch': 0.2, 'roll': 2.6, 'yaw': 1.5},\n",
       "   'gender': 'female',\n",
       "   'age': 23.0,\n",
       "   'facialHair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0},\n",
       "   'glasses': 'NoGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.0,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 1.0,\n",
       "    'neutral': 0.0,\n",
       "    'sadness': 0.0,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.0},\n",
       "   'exposure': {'exposureLevel': 'goodExposure', 'value': 0.56},\n",
       "   'noise': {'noiseLevel': 'medium', 'value': 0.33},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': False},\n",
       "   'accessories': [],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.11,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'black', 'confidence': 1.0},\n",
       "     {'color': 'brown', 'confidence': 0.81},\n",
       "     {'color': 'other', 'confidence': 0.41},\n",
       "     {'color': 'gray', 'confidence': 0.37},\n",
       "     {'color': 'blond', 'confidence': 0.03},\n",
       "     {'color': 'red', 'confidence': 0.02},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}},\n",
       " {'faceId': 'c29e7a06-72de-4b77-bc5d-5568145f10eb',\n",
       "  'faceRectangle': {'top': 95, 'left': 238, 'width': 51, 'height': 51},\n",
       "  'faceAttributes': {'smile': 0.981,\n",
       "   'headPose': {'pitch': 7.2, 'roll': 1.2, 'yaw': 2.6},\n",
       "   'gender': 'female',\n",
       "   'age': 18.0,\n",
       "   'facialHair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0},\n",
       "   'glasses': 'ReadingGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.0,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 0.981,\n",
       "    'neutral': 0.019,\n",
       "    'sadness': 0.0,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.07},\n",
       "   'exposure': {'exposureLevel': 'goodExposure', 'value': 0.69},\n",
       "   'noise': {'noiseLevel': 'medium', 'value': 0.48},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': False},\n",
       "   'accessories': [{'type': 'glasses', 'confidence': 1.0}],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.11,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'black', 'confidence': 0.98},\n",
       "     {'color': 'brown', 'confidence': 0.86},\n",
       "     {'color': 'other', 'confidence': 0.4},\n",
       "     {'color': 'gray', 'confidence': 0.36},\n",
       "     {'color': 'blond', 'confidence': 0.09},\n",
       "     {'color': 'red', 'confidence': 0.08},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}},\n",
       " {'faceId': '0192c19c-eb0a-447b-82f1-740f32eb004a',\n",
       "  'faceRectangle': {'top': 94, 'left': 540, 'width': 48, 'height': 48},\n",
       "  'faceAttributes': {'smile': 1.0,\n",
       "   'headPose': {'pitch': -7.7, 'roll': 5.0, 'yaw': 6.9},\n",
       "   'gender': 'female',\n",
       "   'age': 19.0,\n",
       "   'facialHair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0},\n",
       "   'glasses': 'NoGlasses',\n",
       "   'emotion': {'anger': 0.0,\n",
       "    'contempt': 0.0,\n",
       "    'disgust': 0.0,\n",
       "    'fear': 0.0,\n",
       "    'happiness': 1.0,\n",
       "    'neutral': 0.0,\n",
       "    'sadness': 0.0,\n",
       "    'surprise': 0.0},\n",
       "   'blur': {'blurLevel': 'low', 'value': 0.08},\n",
       "   'exposure': {'exposureLevel': 'goodExposure', 'value': 0.65},\n",
       "   'noise': {'noiseLevel': 'low', 'value': 0.08},\n",
       "   'makeup': {'eyeMakeup': False, 'lipMakeup': False},\n",
       "   'accessories': [],\n",
       "   'occlusion': {'foreheadOccluded': False,\n",
       "    'eyeOccluded': False,\n",
       "    'mouthOccluded': False},\n",
       "   'hair': {'bald': 0.1,\n",
       "    'invisible': False,\n",
       "    'hairColor': [{'color': 'black', 'confidence': 1.0},\n",
       "     {'color': 'brown', 'confidence': 0.88},\n",
       "     {'color': 'other', 'confidence': 0.35},\n",
       "     {'color': 'gray', 'confidence': 0.33},\n",
       "     {'color': 'blond', 'confidence': 0.05},\n",
       "     {'color': 'red', 'confidence': 0.04},\n",
       "     {'color': 'white', 'confidence': 0.0}]}}}]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# A-2\n",
    "results = response.json()\n",
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A-3 pandas 数据表格化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>faceId</th>\n",
       "      <th>faceRectangle.top</th>\n",
       "      <th>faceRectangle.left</th>\n",
       "      <th>faceRectangle.width</th>\n",
       "      <th>faceRectangle.height</th>\n",
       "      <th>faceAttributes.smile</th>\n",
       "      <th>faceAttributes.headPose.pitch</th>\n",
       "      <th>faceAttributes.headPose.roll</th>\n",
       "      <th>faceAttributes.headPose.yaw</th>\n",
       "      <th>faceAttributes.gender</th>\n",
       "      <th>...</th>\n",
       "      <th>faceAttributes.noise.value</th>\n",
       "      <th>faceAttributes.makeup.eyeMakeup</th>\n",
       "      <th>faceAttributes.makeup.lipMakeup</th>\n",
       "      <th>faceAttributes.accessories</th>\n",
       "      <th>faceAttributes.occlusion.foreheadOccluded</th>\n",
       "      <th>faceAttributes.occlusion.eyeOccluded</th>\n",
       "      <th>faceAttributes.occlusion.mouthOccluded</th>\n",
       "      <th>faceAttributes.hair.bald</th>\n",
       "      <th>faceAttributes.hair.invisible</th>\n",
       "      <th>faceAttributes.hair.hairColor</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1f2bf379-70dd-41be-86c3-a63f2deb7c7f</td>\n",
       "      <td>118</td>\n",
       "      <td>144</td>\n",
       "      <td>88</td>\n",
       "      <td>88</td>\n",
       "      <td>0.813</td>\n",
       "      <td>-3.4</td>\n",
       "      <td>1.4</td>\n",
       "      <td>9.4</td>\n",
       "      <td>male</td>\n",
       "      <td>...</td>\n",
       "      <td>0.01</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>[]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.18</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'brown', 'confidence': 0.95}, {'col...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>f659ea05-a658-497d-9b2a-eb89e74d5403</td>\n",
       "      <td>117</td>\n",
       "      <td>376</td>\n",
       "      <td>64</td>\n",
       "      <td>64</td>\n",
       "      <td>0.456</td>\n",
       "      <td>-1.1</td>\n",
       "      <td>-0.2</td>\n",
       "      <td>6.6</td>\n",
       "      <td>female</td>\n",
       "      <td>...</td>\n",
       "      <td>0.01</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>[]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.08</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'black', 'confidence': 1.0}, {'colo...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5e17a0f5-0a18-4a83-821a-31dd3fd014cd</td>\n",
       "      <td>41</td>\n",
       "      <td>676</td>\n",
       "      <td>52</td>\n",
       "      <td>52</td>\n",
       "      <td>1.000</td>\n",
       "      <td>3.0</td>\n",
       "      <td>-1.3</td>\n",
       "      <td>-0.6</td>\n",
       "      <td>male</td>\n",
       "      <td>...</td>\n",
       "      <td>0.07</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'type': 'glasses', 'confidence': 1.0}]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.06</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'black', 'confidence': 0.98}, {'col...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>c9b6de20-4b5c-4a87-88ce-482b2049a45c</td>\n",
       "      <td>69</td>\n",
       "      <td>445</td>\n",
       "      <td>52</td>\n",
       "      <td>52</td>\n",
       "      <td>1.000</td>\n",
       "      <td>0.2</td>\n",
       "      <td>2.6</td>\n",
       "      <td>1.5</td>\n",
       "      <td>female</td>\n",
       "      <td>...</td>\n",
       "      <td>0.33</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>[]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.11</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'black', 'confidence': 1.0}, {'colo...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>c29e7a06-72de-4b77-bc5d-5568145f10eb</td>\n",
       "      <td>95</td>\n",
       "      <td>238</td>\n",
       "      <td>51</td>\n",
       "      <td>51</td>\n",
       "      <td>0.981</td>\n",
       "      <td>7.2</td>\n",
       "      <td>1.2</td>\n",
       "      <td>2.6</td>\n",
       "      <td>female</td>\n",
       "      <td>...</td>\n",
       "      <td>0.48</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'type': 'glasses', 'confidence': 1.0}]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.11</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'black', 'confidence': 0.98}, {'col...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0192c19c-eb0a-447b-82f1-740f32eb004a</td>\n",
       "      <td>94</td>\n",
       "      <td>540</td>\n",
       "      <td>48</td>\n",
       "      <td>48</td>\n",
       "      <td>1.000</td>\n",
       "      <td>-7.7</td>\n",
       "      <td>5.0</td>\n",
       "      <td>6.9</td>\n",
       "      <td>female</td>\n",
       "      <td>...</td>\n",
       "      <td>0.08</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>[]</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>0.10</td>\n",
       "      <td>False</td>\n",
       "      <td>[{'color': 'black', 'confidence': 1.0}, {'colo...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>6 rows × 38 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 faceId  faceRectangle.top  \\\n",
       "0  1f2bf379-70dd-41be-86c3-a63f2deb7c7f                118   \n",
       "1  f659ea05-a658-497d-9b2a-eb89e74d5403                117   \n",
       "2  5e17a0f5-0a18-4a83-821a-31dd3fd014cd                 41   \n",
       "3  c9b6de20-4b5c-4a87-88ce-482b2049a45c                 69   \n",
       "4  c29e7a06-72de-4b77-bc5d-5568145f10eb                 95   \n",
       "5  0192c19c-eb0a-447b-82f1-740f32eb004a                 94   \n",
       "\n",
       "   faceRectangle.left  faceRectangle.width  faceRectangle.height  \\\n",
       "0                 144                   88                    88   \n",
       "1                 376                   64                    64   \n",
       "2                 676                   52                    52   \n",
       "3                 445                   52                    52   \n",
       "4                 238                   51                    51   \n",
       "5                 540                   48                    48   \n",
       "\n",
       "   faceAttributes.smile  faceAttributes.headPose.pitch  \\\n",
       "0                 0.813                           -3.4   \n",
       "1                 0.456                           -1.1   \n",
       "2                 1.000                            3.0   \n",
       "3                 1.000                            0.2   \n",
       "4                 0.981                            7.2   \n",
       "5                 1.000                           -7.7   \n",
       "\n",
       "   faceAttributes.headPose.roll  faceAttributes.headPose.yaw  \\\n",
       "0                           1.4                          9.4   \n",
       "1                          -0.2                          6.6   \n",
       "2                          -1.3                         -0.6   \n",
       "3                           2.6                          1.5   \n",
       "4                           1.2                          2.6   \n",
       "5                           5.0                          6.9   \n",
       "\n",
       "  faceAttributes.gender  ...  faceAttributes.noise.value  \\\n",
       "0                  male  ...                        0.01   \n",
       "1                female  ...                        0.01   \n",
       "2                  male  ...                        0.07   \n",
       "3                female  ...                        0.33   \n",
       "4                female  ...                        0.48   \n",
       "5                female  ...                        0.08   \n",
       "\n",
       "   faceAttributes.makeup.eyeMakeup  faceAttributes.makeup.lipMakeup  \\\n",
       "0                            False                            False   \n",
       "1                            False                             True   \n",
       "2                            False                            False   \n",
       "3                            False                            False   \n",
       "4                            False                            False   \n",
       "5                            False                            False   \n",
       "\n",
       "                 faceAttributes.accessories  \\\n",
       "0                                        []   \n",
       "1                                        []   \n",
       "2  [{'type': 'glasses', 'confidence': 1.0}]   \n",
       "3                                        []   \n",
       "4  [{'type': 'glasses', 'confidence': 1.0}]   \n",
       "5                                        []   \n",
       "\n",
       "  faceAttributes.occlusion.foreheadOccluded  \\\n",
       "0                                     False   \n",
       "1                                     False   \n",
       "2                                     False   \n",
       "3                                     False   \n",
       "4                                     False   \n",
       "5                                     False   \n",
       "\n",
       "   faceAttributes.occlusion.eyeOccluded  \\\n",
       "0                                 False   \n",
       "1                                 False   \n",
       "2                                 False   \n",
       "3                                 False   \n",
       "4                                 False   \n",
       "5                                 False   \n",
       "\n",
       "   faceAttributes.occlusion.mouthOccluded  faceAttributes.hair.bald  \\\n",
       "0                                   False                      0.18   \n",
       "1                                   False                      0.08   \n",
       "2                                   False                      0.06   \n",
       "3                                   False                      0.11   \n",
       "4                                   False                      0.11   \n",
       "5                                   False                      0.10   \n",
       "\n",
       "   faceAttributes.hair.invisible  \\\n",
       "0                          False   \n",
       "1                          False   \n",
       "2                          False   \n",
       "3                          False   \n",
       "4                          False   \n",
       "5                          False   \n",
       "\n",
       "                       faceAttributes.hair.hairColor  \n",
       "0  [{'color': 'brown', 'confidence': 0.95}, {'col...  \n",
       "1  [{'color': 'black', 'confidence': 1.0}, {'colo...  \n",
       "2  [{'color': 'black', 'confidence': 0.98}, {'col...  \n",
       "3  [{'color': 'black', 'confidence': 1.0}, {'colo...  \n",
       "4  [{'color': 'black', 'confidence': 0.98}, {'col...  \n",
       "5  [{'color': 'black', 'confidence': 1.0}, {'colo...  \n",
       "\n",
       "[6 rows x 38 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# A-3\n",
    "import pandas as pd\n",
    "df_face = pd.json_normalize(results)\n",
    "df_face"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## A-4 数据取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1f2bf379-70dd-41be-86c3-a63f2deb7c7f',\n",
       " 'f659ea05-a658-497d-9b2a-eb89e74d5403',\n",
       " '5e17a0f5-0a18-4a83-821a-31dd3fd014cd',\n",
       " 'c9b6de20-4b5c-4a87-88ce-482b2049a45c',\n",
       " 'c29e7a06-72de-4b77-bc5d-5568145f10eb',\n",
       " '0192c19c-eb0a-447b-82f1-740f32eb004a']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "faceID = df_face['faceId'].values.tolist()\n",
    "faceID "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['faceId', 'faceRectangle.top', 'faceRectangle.left',\n",
       "       'faceRectangle.width', 'faceRectangle.height', 'faceAttributes.smile',\n",
       "       'faceAttributes.headPose.pitch', 'faceAttributes.headPose.roll',\n",
       "       'faceAttributes.headPose.yaw', 'faceAttributes.gender',\n",
       "       'faceAttributes.age', 'faceAttributes.facialHair.moustache',\n",
       "       'faceAttributes.facialHair.beard',\n",
       "       'faceAttributes.facialHair.sideburns', 'faceAttributes.glasses',\n",
       "       'faceAttributes.emotion.anger', 'faceAttributes.emotion.contempt',\n",
       "       'faceAttributes.emotion.disgust', 'faceAttributes.emotion.fear',\n",
       "       'faceAttributes.emotion.happiness', 'faceAttributes.emotion.neutral',\n",
       "       'faceAttributes.emotion.sadness', 'faceAttributes.emotion.surprise',\n",
       "       'faceAttributes.blur.blurLevel', 'faceAttributes.blur.value',\n",
       "       'faceAttributes.exposure.exposureLevel',\n",
       "       'faceAttributes.exposure.value', 'faceAttributes.noise.noiseLevel',\n",
       "       'faceAttributes.noise.value', 'faceAttributes.makeup.eyeMakeup',\n",
       "       'faceAttributes.makeup.lipMakeup', 'faceAttributes.accessories',\n",
       "       'faceAttributes.occlusion.foreheadOccluded',\n",
       "       'faceAttributes.occlusion.eyeOccluded',\n",
       "       'faceAttributes.occlusion.mouthOccluded', 'faceAttributes.hair.bald',\n",
       "       'faceAttributes.hair.invisible', 'faceAttributes.hair.hairColor'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查属性/特征值\n",
    "df_face.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>faceId</th>\n",
       "      <th>faceAttributes.glasses</th>\n",
       "      <th>faceAttributes.emotion.neutral</th>\n",
       "      <th>faceAttributes.age</th>\n",
       "      <th>faceAttributes.gender</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1f2bf379-70dd-41be-86c3-a63f2deb7c7f</td>\n",
       "      <td>NoGlasses</td>\n",
       "      <td>0.184</td>\n",
       "      <td>19.0</td>\n",
       "      <td>male</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>f659ea05-a658-497d-9b2a-eb89e74d5403</td>\n",
       "      <td>NoGlasses</td>\n",
       "      <td>0.542</td>\n",
       "      <td>22.0</td>\n",
       "      <td>female</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5e17a0f5-0a18-4a83-821a-31dd3fd014cd</td>\n",
       "      <td>ReadingGlasses</td>\n",
       "      <td>0.000</td>\n",
       "      <td>25.0</td>\n",
       "      <td>male</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>c9b6de20-4b5c-4a87-88ce-482b2049a45c</td>\n",
       "      <td>NoGlasses</td>\n",
       "      <td>0.000</td>\n",
       "      <td>23.0</td>\n",
       "      <td>female</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>c29e7a06-72de-4b77-bc5d-5568145f10eb</td>\n",
       "      <td>ReadingGlasses</td>\n",
       "      <td>0.019</td>\n",
       "      <td>18.0</td>\n",
       "      <td>female</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0192c19c-eb0a-447b-82f1-740f32eb004a</td>\n",
       "      <td>NoGlasses</td>\n",
       "      <td>0.000</td>\n",
       "      <td>19.0</td>\n",
       "      <td>female</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 faceId faceAttributes.glasses  \\\n",
       "0  1f2bf379-70dd-41be-86c3-a63f2deb7c7f              NoGlasses   \n",
       "1  f659ea05-a658-497d-9b2a-eb89e74d5403              NoGlasses   \n",
       "2  5e17a0f5-0a18-4a83-821a-31dd3fd014cd         ReadingGlasses   \n",
       "3  c9b6de20-4b5c-4a87-88ce-482b2049a45c              NoGlasses   \n",
       "4  c29e7a06-72de-4b77-bc5d-5568145f10eb         ReadingGlasses   \n",
       "5  0192c19c-eb0a-447b-82f1-740f32eb004a              NoGlasses   \n",
       "\n",
       "   faceAttributes.emotion.neutral  faceAttributes.age faceAttributes.gender  \n",
       "0                           0.184                19.0                  male  \n",
       "1                           0.542                22.0                female  \n",
       "2                           0.000                25.0                  male  \n",
       "3                           0.000                23.0                female  \n",
       "4                           0.019                18.0                female  \n",
       "5                           0.000                19.0                female  "
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 可观察其中几组数据\n",
    "df_face[['faceId','faceAttributes.glasses','faceAttributes.emotion.neutral','faceAttributes.age','faceAttributes.gender']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Azure 认知服务-人脸演示"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 试一试：人脸验证(难)\n",
    "\n",
    "人脸相似度？有没有试下？\n",
    "\n",
    ">* API人脸文档中最重要的组成部分：\n",
    " >>* Request URL？\n",
    " >>* Http Method？\n",
    " >>* 参数？\n",
    "\n",
    "----\n",
    ">* 不同的人脸对比数据\n",
    "  >>* 人脸验证关键数据？\n",
    "  >>* 根据哪些数据证明是同一个人？\n",
    "    \n",
    "----\n",
    ">* 具体步骤：\n",
    "  >>* 1、Create 请求成功200 返回空字符串\n",
    "  >>* 2、Add face 请求成功200 返回persistedFaceId\n",
    "  >>* 3、Detect 准备 被检测人 人脸的id\n",
    "  >>* 4、Find similars 返回相似置信度\n",
    "  >>* 附加：get查看facelists\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu \n",
      " https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu \n",
      " https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\n"
     ]
    }
   ],
   "source": [
    "# 字符串拼接练习\n",
    "faceListId = \"xinyu\"\n",
    "# 1\n",
    "url_01 = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/\" + faceListId # string 拼接\n",
    "# 2\n",
    "url_02 = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/%s\" %(faceListId)\n",
    "# 3 \n",
    "url_03 = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/{}\".format(faceListId)\n",
    "print(url_01,'\\n',url_02,'\\n',url_03)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### create facelist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "# 1、create  list列表\n",
    "# faceListId\n",
    "faceListId =  \"xinyu\"# 学生填写设置人脸列表ID\n",
    "create_facelists_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\" # 学生填写 ☆ 注意此条url修改\n",
    "subscription_key = \"7be210d7eecb494da6f7e5bb3fb977d6\"\n",
    "assert subscription_key\n",
    "\n",
    "headers = {\n",
    "    # Request headers\n",
    "    'Content-Type': 'application/json',\n",
    "    'Ocp-Apim-Subscription-Key': '7be210d7eecb494da6f7e5bb3fb977d6',\n",
    "}\n",
    "data = {\n",
    "    \"name\": \"人脸\",\n",
    "    \"userData\": \"我的同学们\",\n",
    "    \"recognitionModel\": \"recognition_03\",\n",
    "    \n",
    "}\n",
    "\n",
    "r_create = requests.put(create_facelists_url,headers=headers,json=data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Response [200]>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r_create"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b''"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r_create.content"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### get facelist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查你的facelist的信息\n",
    "get_facelist_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\"# 学生填写\n",
    "r_get_facelist = requests.get(get_facelist_url,headers=headers)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'persistedFaces': [],\n",
       " 'faceListId': 'xinyu',\n",
       " 'name': '人脸',\n",
       " 'userData': '我的同学们'}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r_get_facelist.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Add face 请求成功200 返回persistedFaceId\n",
    "> 我们通过上面的步骤建好了一个脸的列表，接下来我们要给这个列表添加脸了！把我们想要对比的脸存进列表吧\n",
    "- [添加人脸进列表api文档](https://docs.microsoft.com/zh-cn/rest/api/cognitiveservices/face/facelist/addfacefromurl)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#先加一张脸试试\n",
    "# 2、Add face\n",
    "add_face_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/{}/persistedfaces\"\n",
    "\n",
    "assert subscription_key\n",
    "headers = {\n",
    "    # Request headers\n",
    "    'Content-Type': 'application/json',\n",
    "    'Ocp-Apim-Subscription-Key': subscription_key,\n",
    "}\n",
    "img_url = \"https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3020746934,1868028767&fm=26&gp=0.jpg\"\n",
    "\n",
    "params_add_face={\n",
    "    \"userData\":\"zhixiu\"\n",
    "}\n",
    "\n",
    "r_add_face = requests.post(add_face_url,headers=headers,params=params_add_face,json={\"url\":img_url})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_add_face.status_code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查你的facelist的信息\n",
    "get_facelist_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\"\n",
    "r_get_facelist = requests.get(get_facelist_url,headers=headers)\n",
    "r_get_facelist.json()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 封装成函数方便添加图片/函数——可以重复使用相同的功能\n",
    "def AddFace(img_url=str,userData=str):\n",
    "    add_face_url =\"https://api-hjq.cognitiveservices.azure.com/face/v1.0/facelists/{}/persistedFaces\"\n",
    "    assert subscription_key\n",
    "    headers = {\n",
    "        # Request headers\n",
    "        'Content-Type': 'application/json',\n",
    "        'Ocp-Apim-Subscription-Key': subscription_key,\n",
    "    }\n",
    "    img_url = img_url\n",
    "\n",
    "    params_add_face={\n",
    "        \"userData\":userData\n",
    "    }\n",
    "    r_add_face = requests.post(add_face_url.format(faceListId),headers=headers,params=params_add_face,json={\"url\":img_url})\n",
    "    return r_add_face.status_code#返回出状态码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/Autumnhui.jpg\",\"丘天惠\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/L-Tony-info.jpg\",\"林嘉茵\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/TLINGP.jpg\",\"汤玲萍\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/WenYanZeng.jpg\",\"曾雯燕\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/XIEIC.jpg\",\"谢依希\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/YuecongYang.png\",\"杨悦聪\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/Zoezhouyu.jpg\",\"周雨\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/crayon-heimi.jpg\",\"刘瑜鹏\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/jiayichen.jpg\",\"陈嘉仪\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/kg2000.jpg\",\"徐旖芊\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/liuxinrujiayou.jpg\",\"刘心如\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/liuyu19.png\",\"刘宇\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/ltco.jpg\",\"李婷\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/lucaszy.jpg\",\"黄智毅\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/pingzi0211.jpg\",\"黄慧文\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/shmimy-cn.jpg\",\"张铭睿\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/yichenting.jpg\",\"陈婷\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/coco022.jpg\",\"洪可凡\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/lujizhi.png\",\"卢继志\")\n",
    "AddFace(\"http://huangjieqi.gitee.io/picture_storage/zzlhyy.jpg\",\"张梓乐\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 扩展内容，封装成函数方便多次使用 *\n",
    "> 我们要添加多张脸，但是为了减少代码量，我们可以把代码封装成函数，避免每次都要写一大堆代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 检查你的facelist的信息\n",
    "get_facelist_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\"\n",
    "r_get_facelist = requests.get(get_facelist_url,headers=headers)\n",
    "r_get_facelist.json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "faceId =  r_get_facelist.json()['persistedFaces']\n",
    "faceId"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 键/值\n",
    "for i in faceId:\n",
    "#     print(i)\n",
    "    if i[\"userData\"] == \"林嘉茵\":\n",
    "        faceId_02 = i['persistedFaceId']\n",
    "faceId_02\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "faceId =  r_get_facelist.json()['persistedFaces']\n",
    "faceId"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for item in faceId:\n",
    "#     print(item)\n",
    "    if item['userData'] == '黄智毅':\n",
    "        print(item['persistedFaceId'])\n",
    "        delate_face = item['persistedFaceId']\n",
    "delate_face"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### delate face"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Detect face 删除列表内人脸id\n",
    "faceListId = \"xinyu\"\n",
    "delete_face_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\"\n",
    "\n",
    "assert subscription_key = \"7be210d7eecb494da6f7e5bb3fb977d6\"\n",
    "# 例如：删除黄志毅： {'persistedFaceId': '69103b48-b6c4-4f58-8ac1-4c8b84e56bc1','userData': '黄智毅'},\n",
    "\n",
    "\n",
    "persistedFaceId = delate_face\n",
    "# 直接取上面获得的ID{'persistedFaceId': 'f18450d3-60d2-45f3-a69e-783574dc3ce8'} \n",
    "\n",
    "headers = {\n",
    "    # Request headers\n",
    "    'Content-Type': 'application/json',\n",
    "    'Ocp-Apim-Subscription-Key': '7be210d7eecb494da6f7e5bb3fb977d6',\n",
    "}\n",
    "\n",
    "# 注意requests请求为delete\n",
    "r_delete_face = requests.delete(delete_face_url.format(faceListId,persistedFaceId),headers=headers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_delete_face"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查你的facelist的信息\n",
    "get_facelist_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu\"\n",
    "r_get_facelist = requests.get(get_facelist_url,headers=headers)\n",
    "r_get_facelist.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Find similars 返回相似置信度\n",
    "- [监测人脸相似度api文档](https://docs.microsoft.com/zh-cn/rest/api/cognitiveservices/face/face/findsimilar)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Detect 检测人脸的id\n",
    "# replace <My Endpoint String> with the string from your endpoint URL\n",
    "face_api_url = 'https://api-xyr.cognitiveservices.azure.com/face/v1.0/facelists/xinyu'\n",
    "\n",
    "# 请求正文\n",
    "image_url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1603538817469&di=0c234c4bd1db79c1e22416abfe76fd87&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201902%2F09%2F20190209193819_rsyyg.jpg'\n",
    "\n",
    "headers = {'Ocp-Apim-Subscription-Key': subscription_key}\n",
    "\n",
    "# 请求参数\n",
    "params = {\n",
    "    'returnFaceId': 'true',\n",
    "    'returnFaceLandmarks': 'false',\n",
    "    # 选择model\n",
    "    'recognitionModel':'recognition_03',#此参数需与facelist参数一致\n",
    "    'detectionModel':'detection_01',\n",
    "    # 可选参数,请仔细阅读API文档\n",
    "    'returnFaceAttributes': '',\n",
    "}\n",
    "\n",
    "response = requests.post(face_api_url, params=params,\n",
    "                         headers=headers, json={\"url\": image_url})\n",
    "# json.dumps 将json--->字符串\n",
    "response.json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "findsimilars_url = \"https://api-xyr.cognitiveservices.azure.com/face/v1.0/findsimilars\"\n",
    "\n",
    "# 请求正文 faceId需要先检测一张照片获取\n",
    "data_findsimilars = {\n",
    "    \"faceId\":\"7be210d7eecb494da6f7e5bb3fb977d6\",#取上方的faceID\n",
    "    \"faceListId\": \"xinyu\",\n",
    "#     \"faceIds\":faceId_02,\n",
    "    \"maxNumOfCandidatesReturned\": 10,\n",
    "    \"mode\": \"matchFace\"#matchPerson #一种为验证模式，一种为相似值模式\n",
    "    }\n",
    "\n",
    "r_findsimilars = requests.post(findsimilars_url,headers=headers,json=data_findsimilars)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_findsimilars"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_findsimilars.json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "#facelist里面的数据\n",
    "faceListId_df = pd.json_normalize(r_get_facelist.json()[\"persistedFaces\"])# 升级pandas才能运行\n",
    "faceListId_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 返回相似度的数据\n",
    "find_df = pd.json_normalize(r_findsimilars.json())# 升级pandas才能运行\n",
    "find_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "pd.merge(faceListId_df, find_df,how='inner', on='persistedFaceId').sort_values(by=\"confidence\",ascending = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 设计人脸识别门禁/打卡/签到 小程序"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Face++ FaceSets 实践\n",
    "\n",
    "\n",
    ">* 1. FaceSet Create\n",
    ">* 2. FaceSet GetDetail\n",
    ">* 3. FaceSet AddFace\n",
    ">* 4. FaceSet RemoveFace\n",
    ">* 5. FaceSet Update\n",
    ">* 6. Compare Face"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备工作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "api_secret = \"i99IDxe1ek9kfRYru_p6bfNfYZj_H7fZ\" \n",
    "api_key = \"i99IDxe1ek9kfRYru_p6bfNfYZj_H7fZ\"  # Replace with a valid Subscription Key here."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FaceSet Create（创建人脸集合）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. FaceSet Create\n",
    "import requests,json\n",
    "\n",
    "display_name = \"CLUB\"\n",
    "outer_id = \"40\"\n",
    "user_data = \"30个女生，10个男生\"\n",
    "\n",
    "CreateFace_Url = \"https://api-cn.faceplusplus.com/facepp/v3/faceset/create\"\n",
    "payload = {\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'display_name':display_name,\n",
    "    'outer_id':outer_id,\n",
    "    'user_data':user_data\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(CreateFace_Url, params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FaceSet GetDetail（获取人脸集合信息）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "GetDetail_Url = \"https://api-cn.faceplusplus.com/facepp/v3/faceset/getdetail\"\n",
    "\n",
    "payload = {\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'outer_id':outer_id,\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(GetDetail_Url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FaceSet AddFace（增加人脸信息）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "AddFace_url = \" https://api-cn.faceplusplus.com/facepp/v3/faceset/addface\"\n",
    "\n",
    "payload = {\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'faceset_token':'37071d95016c1b2d81591a6f0c1681f2',\n",
    "    'face_tokens':'b0407b9e803ebd39d511cd7956fd5bf5',\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(AddFace_url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'faceset_token': '37071d95016c1b2d81591a6f0c1681f2',\n",
       " 'time_used': 474,\n",
       " 'face_count': 1,\n",
       " 'face_added': 1,\n",
       " 'request_id': '1602154815,34232e34-6c7d-42a7-8123-c1ba3b22a52c',\n",
       " 'outer_id': '00001',\n",
       " 'failure_detail': []}"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FaceSet RemoveFace（移除人脸信息）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [],
   "source": [
    "RemoveFace_url = \" https://api-cn.faceplusplus.com/facepp/v3/faceset/removeface\"\n",
    "\n",
    "payload = {\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'faceset_token':'37071d95016c1b2d81591a6f0c1681f2',\n",
    "    'face_tokens':'b0407b9e803ebd39d511cd7956fd5bf5',\n",
    "}\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(RemoveFace_url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'faceset_token': '37071d95016c1b2d81591a6f0c1681f2',\n",
       " 'face_removed': 1,\n",
       " 'time_used': 175,\n",
       " 'face_count': 0,\n",
       " 'request_id': '1602155720,7a6b9a32-08ca-4c14-981d-d4ffbd82da48',\n",
       " 'outer_id': '00001',\n",
       " 'failure_detail': []}"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## FaceSet Update（更新人脸集合信息）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [],
   "source": [
    "Update_url = \"https://api-cn.faceplusplus.com/facepp/v3/faceset/update\"\n",
    "\n",
    "payload = {\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'faceset_token':'37071d95016c1b2d81591a6f0c1681f2',\n",
    "    'user_data':\"53人，21男生，32女生\",\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(Update_url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'faceset_token': '37071d95016c1b2d81591a6f0c1681f2',\n",
       " 'request_id': '1602156047,b3980a91-cd76-4aad-9e06-3f1a2c10325b',\n",
       " 'time_used': 80,\n",
       " 'outer_id': '00001'}"
      ]
     },
     "execution_count": 148,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compare Face（对比人脸相似度）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [],
   "source": [
    "liudehua01 = \"https://gss0.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/7c1ed21b0ef41bd57f7f20ff57da81cb39db3d89.jpg\"\n",
    "liudehua02 = \"https://tse3-mm.cn.bing.net/th/id/OIP.Xz3HbYZeNrdUnGJ7vXNzsQHaKO?pid=Api&rs=1\"\n",
    "wangzulan = \"https://tse3-mm.cn.bing.net/th/id/OIP.ZnXeGoVYT4jQudiPOGZn3QAAAA?pid=Api&rs=1\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 方案1:直接对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [],
   "source": [
    "Compare_url = \"https://api-cn.faceplusplus.com/facepp/v3/compare\"\n",
    "\n",
    "payload ={\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'image_url1':liudehua01,\n",
    "    'image_url2':wangzulan\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(Compare_url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'faces1': [{'face_rectangle': {'width': 824,\n",
       "    'top': 871,\n",
       "    'left': 1114,\n",
       "    'height': 824},\n",
       "   'face_token': '6ef9a57fc3f0ed2d7c1281ebd425eceb'}],\n",
       " 'faces2': [{'face_rectangle': {'width': 86,\n",
       "    'top': 91,\n",
       "    'left': 65,\n",
       "    'height': 86},\n",
       "   'face_token': '1985524760edebbade25928e3cde4c54'}],\n",
       " 'time_used': 7041,\n",
       " 'thresholds': {'1e-3': 62.327, '1e-5': 73.975, '1e-4': 69.101},\n",
       " 'confidence': 26.085,\n",
       " 'image_id2': 'g6kg8zfyOouG6ftP+GvEfg==',\n",
       " 'image_id1': 'KIOXEC2V/MyL4zuopAcNig==',\n",
       " 'request_id': '1602156739,fbb73343-bf79-46bd-b9a3-646a4b0c6155'}"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 方案2:与人脸集合进行对比"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 面部检测(获取face_token)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "Detect_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect' \n",
    "img_url = liudehua01\n",
    "\n",
    "payload = {\n",
    "    \"image_url\":img_url,\n",
    "    'api_key': api_key,\n",
    "    'api_secret': api_secret,\n",
    "    'return_attributes':'gender,age,smiling,emotion', \n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "r = requests.post(Detect_url,params=payload)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'request_id': '1602156888,bb225838-b1e2-4081-bc24-df469506fee6',\n",
       " 'time_used': 1300,\n",
       " 'faces': [{'face_token': 'f390216cf98409392ab336a7861874a7',\n",
       "   'face_rectangle': {'top': 871, 'left': 1114, 'width': 824, 'height': 824},\n",
       "   'attributes': {'gender': {'value': 'Male'},\n",
       "    'age': {'value': 59},\n",
       "    'smile': {'value': 99.998, 'threshold': 50.0},\n",
       "    'emotion': {'anger': 0.0,\n",
       "     'disgust': 0.047,\n",
       "     'fear': 0.0,\n",
       "     'happiness': 99.945,\n",
       "     'neutral': 0.0,\n",
       "     'sadness': 0.007,\n",
       "     'surprise': 0.0}}}],\n",
       " 'image_id': 'KIOXEC2V/MyL4zuopAcNig==',\n",
       " 'face_num': 1}"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r.json()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 加入人脸集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 人脸识别社会/政治使用思考\n",
    "> 人脸识别的 API比较\n",
    ">> * [Face Off: Confronting Bias in Face Recognition AI](https://www.kairos.com/blog/face-off-confronting-bias-in-face-recognition-ai)\n",
    ">> * [为什么世界现在需要道德的面部识别](https://www.kairos.com/blog/why-the-world-needs-ethical-facial-recognition-now)\n",
    "    * 到2023年，全球人脸识别市场的价值估计接近100亿美元，复合年增长率为16.8％。市场背后的主要增长动力是监视市场的发展以及生物识别技术领域的政府支出。但是，面部识别的使用在其他领域也有很大贡献，例如帮助企业打击消费者欺诈，满足动态法规遵从性以及提供可获利的客户体验。\n",
    "\n",
    "-----\n",
    "> 人脸识别的偏差及API 政治经济学 \n",
    ">> * [对抗：面对面部识别AI中的偏见](https://www.kairos.com/blog/face-off-confronting-bias-in-face-recognition-ai)\n",
    "    * 发生了什么？\n",
    "        * “编码注视”或算法偏差的研究: 浅肤色男性的错误率为0.8％ ?  深色皮肤女性的错误率高达34.7％  ? (Microsoft，IBM和Face ++)\n",
    "    * 用户的反应范围从惊奇和赞美到不悦和冒犯\n",
    "        * 我们承认目前提供的种族分类（黑人，白人，亚裔，西班牙裔，其他则不足以代表丰富多样，发展迅速的文化和种族挂毯\n",
    "    * 该怎么办？\n",
    "        * 改善数据\n",
    "        * 寻求持续的反馈    \n",
    "        \n",
    ">>  * [科技行业没有应对面部识别偏见的计划](https://www.theverge.com/2018/7/26/17616290/facial-recognition-ai-bias-benchmark-test) \n",
    ">>> 公司在做什么？(一些高科技大公司支持基准和法规)     \n",
    ">>> 我们如何解决偏见问题？    \n",
    ">>> 偏差不是唯一的问题\n",
    "\n",
    ">> * [面部识别尚未准备好给执法部门使用](https://techcrunch.com/2018/06/25/facial-recognition-software-is-not-ready-for-use-by-law-enforcement/)\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 计算机视觉\n",
    "\n",
    "* 学习并完成所有Azure computer version 的API调用\n",
    "> * 分析远程图像    \n",
    "> * 分析本地图片    \n",
    "> * 生成缩略图    \n",
    "> * 提取印刷体文本和手写文本    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析远程图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'jsonx'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-45-71e699cfd34f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;31m# %matplotlib inline\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mjsonx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      6\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mPIL\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mImage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      7\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mio\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mBytesIO\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'jsonx'"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "# If you are using a Jupyter notebook, uncomment the following line.\n",
    "# %matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import jsonx\n",
    "from PIL import Image\n",
    "from io import BytesIO\n",
    "\n",
    "# Add your Computer Vision subscription key and endpoint to your environment variables.\n",
    "# if 'COMPUTER_VISION_SUBSCRIPTION_KEY' in os.environ:\n",
    "#     subscription_key = os.environ['COMPUTER_VISION_SUBSCRIPTION_KEY']\n",
    "# else:\n",
    "#     print(\"\\nSet the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable.\\n**Restart your shell or IDE for changes to take effect.**\")\n",
    "#     sys.exit()\n",
    "\n",
    "endpoint = \"https://westcentralus.api.cognitive.microsoft.com/\"\n",
    "# if 'COMPUTER_VISION_ENDPOINT' in os.environ:\n",
    "#     endpoint = os.environ['COMPUTER_VISION_ENDPOINT']\n",
    "subscription_key = \"8192a0de854b47719534a1e59d668f2a\"\n",
    "\n",
    "# base url\n",
    "analyze_url = endpoint+ \"vision/v2.1/analyze\"\n",
    "\n",
    "# Set image_url to the URL of an image that you want to analyze.\n",
    "image_url = \"http://wcy.nfu.edu.cn/uploads/allimg/180423/1-1P423204500H9.jpg\"\n",
    "\n",
    "headers = {'Ocp-Apim-Subscription-Key': subscription_key}\n",
    "# 参数\n",
    "params = {'visualFeatures': 'Categories,Description,Color'}\n",
    "# 请求主体body\n",
    "data = {'url': image_url}\n",
    "response = requests.post(analyze_url, headers=headers,\n",
    "                         params=params, json=data)\n",
    "response.raise_for_status()\n",
    "\n",
    "# The 'analysis' object contains various fields that describe the image. The most\n",
    "# relevant caption for the image is obtained from the 'description' property.\n",
    "analysis = response.json()\n",
    "print(json.dumps(response.json()))\n",
    "image_caption = analysis[\"description\"][\"captions\"][0][\"text\"].capitalize()\n",
    "\n",
    "# Display the image and overlay it with the caption.\n",
    "image = Image.open(BytesIO(requests.get(image_url).content))\n",
    "plt.imshow(image)\n",
    "plt.axis(\"off\")\n",
    "_ = plt.title(image_caption, size=\"x-large\", y=-0.1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析本地图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'analyze_url' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-40-aaff7758739a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m     28\u001b[0m \u001b[0mparams\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;34m'visualFeatures'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;34m'Categories,Description,Color'\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     29\u001b[0m response = requests.post(\n\u001b[1;32m---> 30\u001b[1;33m     analyze_url, headers=headers, params=params, data=image_data)\n\u001b[0m\u001b[0;32m     31\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mraise_for_status\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'analyze_url' is not defined"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import sys\n",
    "import requests\n",
    "# If you are using a Jupyter notebook, uncomment the following line.\n",
    "# %matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "from PIL import Image\n",
    "from io import BytesIO\n",
    "\n",
    "# Add your Computer Vision subscription key and endpoint to your environment variables.\n",
    "# if 'COMPUTER_VISION_SUBSCRIPTION_KEY' in os.environ:\n",
    "#     subscription_key = os.environ['COMPUTER_VISION_SUBSCRIPTION_KEY']\n",
    "# else:\n",
    "#     print(\"\\nSet the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable.\\n**Restart your shell or IDE for changes to take effect.**\")\n",
    "#     sys.exit()\n",
    "\n",
    "# if 'COMPUTER_VISION_ENDPOINT' in os.environ:\n",
    "#     endpoint = os.environ['COMPUTER_VISION_ENDPOINT']\n",
    "\n",
    "# analyze_url = endpoint + \"vision/v2.1/analyze\"\n",
    "\n",
    "# Set image_path to the local path of an image that you want to analyze.\n",
    "image_path = \"OIP.jpg\"\n",
    "# Read the image into a byte array\n",
    "image_data = open(image_path, \"rb\").read()\n",
    "headers = {'Ocp-Apim-Subscription-Key': \"dd748cf10bf9404399e5416d9399e218\",\n",
    "           'Content-Type': 'application/octet-stream'}\n",
    "params = {'visualFeatures': 'Categories,Description,Color'}\n",
    "response = requests.post(\n",
    "    analyze_url, headers=headers, params=params, data=image_data)\n",
    "response.raise_for_status()\n",
    "\n",
    "# The 'analysis' object contains various fields that describe the image. The most\n",
    "# relevant caption for the image is obtained from the 'description' property.\n",
    "analysis = response.json()\n",
    "print(analysis)\n",
    "image_caption = analysis[\"description\"][\"captions\"][0][\"text\"].capitalize()\n",
    "\n",
    "# Display the image and overlay it with the caption.\n",
    "image = Image.open(BytesIO(image_data))\n",
    "plt.imshow(image)\n",
    "plt.axis(\"off\")\n",
    "_ = plt.title(image_caption, size=\"x-large\", y=-0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 生成缩略图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Thumbnail is 100-by-100\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import os\n",
    "import sys\n",
    "import requests\n",
    "# If you are using a Jupyter notebook, uncomment the following line.\n",
    "# %matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "from PIL import Image\n",
    "from io import BytesIO\n",
    "\n",
    "# Add your Computer Vision subscription key and endpoint to your environment variables.\n",
    "# if 'COMPUTER_VISION_SUBSCRIPTION_KEY' in os.environ:\n",
    "#     subscription_key = os.environ['COMPUTER_VISION_SUBSCRIPTION_KEY']\n",
    "# else:\n",
    "#     print(\"\\nSet the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable.\\n**Restart your shell or IDE for changes to take effect.**\")\n",
    "#     sys.exit()\n",
    "\n",
    "# if 'COMPUTER_VISION_ENDPOINT' in os.environ:\n",
    "#     endpoint = os.environ['COMPUTER_VISION_ENDPOINT']\n",
    "\n",
    "thumbnail_url = \"https://api-computervvsion-cyl.cognitiveservices.azure.com/\" + \"vision/v2.1/generateThumbnail\"\n",
    "\n",
    "# Set image_url to the URL of an image that you want to analyze.\n",
    "image_url = \"https://upload.wikimedia.org/wikipedia/commons/9/94/Bloodhound_Puppy.jpg\"\n",
    "\n",
    "headers = {'Ocp-Apim-Subscription-Key': \"dd748cf10bf9404399e5416d9399e218\"}\n",
    "params = {'width': '100', 'height': '100', 'smartCropping': 'true'}\n",
    "data = {'url': image_url}\n",
    "response = requests.post(thumbnail_url, headers=headers,\n",
    "                         params=params, json=data)\n",
    "response.raise_for_status()\n",
    "\n",
    "thumbnail = Image.open(BytesIO(response.content))\n",
    "\n",
    "# Display the thumbnail.\n",
    "plt.imshow(thumbnail)\n",
    "plt.axis(\"off\")\n",
    "\n",
    "# Verify the thumbnail size.\n",
    "print(\"Thumbnail is {0}-by-{1}\".format(*thumbnail.size))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 提取印刷体文本和手写文本 \n",
    "* 假如我们抓取了1000张网页，出了文本信息我们分析以外，还有每个页面的图片的信息，我们可以用提取图片文本的方式，将图片的信息也抓取下来\n",
    "* 我们进抓取了图片，想知道这些图片的内容是什么，也可以用提取文本的方式进行提取\n",
    "* ...."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 学习人脸识别和计算机视觉心得体会\n",
    "\n",
    "> 历程艰辛！    \n",
    "> 不会放弃！    \n",
    "> 终得成果！    \n",
    "> 分享经验吧～"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "1.要仔细地阅读文档，和观察url链接的变化\n",
    "2.不懂为什么我的代码运行没有结果，好歹给我来了404吧哭了\n",
    "3.这么课程学的好吃力啊，但是还是要继续努力啊"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "243px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
